package br.com.usapre.faces;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.context.FacesContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import br.com.business.BairroBusiness;
import br.com.business.CidadeBusiness;
import br.com.business.ProdutosBusiness;
import br.com.business.RamoAtividadeBusiness;
import br.com.business.UfBusiness;
import br.com.data.Bairro;
import br.com.data.Cidade;
import br.com.data.GradeProdutos;
import br.com.data.Produtos;
import br.com.data.RamoAtividade;
import br.com.data.Uf;
import br.com.utilidades.database.data.Criterio;
import br.com.utilidades.faces.SimpleMessageBean;
import constantes.CONSTANTES;

/**
 * @version 1.0.0
 * @since Janeiro,29 2013
 * @author Eduardo Francisco Barbosa
 */
@Component
@Scope("session")
public class ConsulteCompareProdutosBean extends SimpleMessageBean implements Serializable {

    private static final long serialVersionUID = 932522606531336394L;

    private RamoAtividadeBusiness tipoParceiroBusinessImpl;

    private ProdutosBusiness produtoBusinessImpl;

    private UfBusiness ufBusinessImpl;
    private CidadeBusiness cidadeBusinessImpl;
    private BairroBusiness bairroBusinessImpl;

    private List<Uf> ufs;
    private Uf uf;

    private List<Cidade> cidades;
    private Cidade cidade;

    private List<Bairro> bairros;
    private Bairro bairro;

    private List<RamoAtividade> ramoAtividades;
    private RamoAtividade ramoAtividade;

    private String nomeProduto;

    private List<Produtos> produtos;
    private Produtos produto;

    private List<GradeProdutos> gradeProdutos;

    private Integer quantidadeProdutos;

    /**
     * Construtor
     */
    @Autowired
    public ConsulteCompareProdutosBean(RamoAtividadeBusiness tipoParceiroBusinessImpl,
	    ProdutosBusiness produtoBusinessImpl, UfBusiness ufBusinessImpl, CidadeBusiness cidadeBusinessImpl,
	    BairroBusiness bairroBusinessImpl) {

	this.tipoParceiroBusinessImpl = tipoParceiroBusinessImpl;

	this.ufBusinessImpl = ufBusinessImpl;
	this.cidadeBusinessImpl = cidadeBusinessImpl;
	this.bairroBusinessImpl = bairroBusinessImpl;

	this.produtoBusinessImpl = produtoBusinessImpl;

	reset();
    }

    /**
     * reset
     */
    public void reset() {

	ramoAtividades = tipoParceiroBusinessImpl.buscarPorNomeBusca("");

	produtos = new ArrayList<Produtos>();

	bairros = new ArrayList<Bairro>();
	cidades = new ArrayList<Cidade>();

	ufs = ufBusinessImpl.buscarPorNomeBusca("");

	for (Uf uft : ufs) {
	    if (uft.getId().equals(CONSTANTES.COD_ESTADO_PADRAO)) {
		uf = uft;
	    }
	}

	atualizaCidade();

	for (Cidade cidadet : cidades) {
	    if (cidadet.getId().equals(CONSTANTES.COD_CIDADE_PADRAO)) {
		cidade = cidadet;
	    }
	}

	atualizaBairro();

    }

    /**
     * atualizaCidade
     */
    public void atualizaCidade() {

	if (uf == null) {

	} else {

	    cidades = new ArrayList<Cidade>();

	    List<Criterio> criterios = new ArrayList<Criterio>();
	    Criterio crit = new Criterio();
	    crit.setCampo("uf.id");
	    crit.setComparacao(" = ");
	    crit.setValue(uf.getId());
	    crit.setTipo(Criterio.TIPO_INTEGER);
	    criterios.add(crit);

	    cidades = cidadeBusinessImpl.buscarPorCriterios(criterios, " nome ");

	}

    }

    /**
     * atualizaBairro
     */
    public void atualizaBairro() {

	if (cidade == null) {

	} else {

	    bairros = new ArrayList<Bairro>();

	    List<Criterio> criterios = new ArrayList<Criterio>();
	    Criterio crit = new Criterio();
	    crit.setCampo("cidade.id");
	    crit.setComparacao(" = ");
	    crit.setValue(cidade.getId());
	    crit.setTipo(Criterio.TIPO_INTEGER);
	    criterios.add(crit);

	    bairros = bairroBusinessImpl.buscarPorCriterios(criterios, " nome ");
	}

    }

    /**
     * buscarProdutos
     */
    public void buscarProdutos() {

	if (this.ramoAtividade == null && (this.nomeProduto == null || this.nomeProduto.equals(""))) {
	    String msg = super.getMensagem("MN_ramo_atividade_obrigatorio");
	    super.enviaMensagem(msg, msg);
	    this.produtos = new ArrayList<Produtos>();
	} else {
	    this.produtos = produtoBusinessImpl.buscarProdutosPorCriterios(this.nomeProduto, this.ramoAtividade);
	}

	this.quantidadeProdutos = this.produtos.size();

	Boolean par = Boolean.FALSE;
	for (Produtos prod : this.produtos) {
	    prod.setPar(par);
	    if (par)
		par = Boolean.FALSE;
	    else
		par = Boolean.TRUE;
	}

	if (this.quantidadeProdutos == 1) {
	    this.setProduto(produtos.iterator().next());
	    this.compararProduto();
	}
    }

    /**
     * compararProduto
     */
    public void compararProduto() {

	if (uf == null || uf.getId() == null) {
	    String msg = super.getMensagem("MN_uf_obrigatorio_comparacao");
	    enviaMensagem(msg, msg);
	} else {
	    gradeProdutos = produtoBusinessImpl.buscarGradeProdutosPorProduto(produto, uf, cidade, bairro);

	    if (gradeProdutos.size() > 0) {
		try {
		    FacesContext.getCurrentInstance().getExternalContext()
			    .redirect("/" + CONSTANTES.URLUSAPRE + "/gerenciamentoConsulteCompareProdutosCompare.jsf");
		} catch (Exception ex) {
		    ex.printStackTrace();
		}
	    } else {

		String msg = super.getMensagem("MN_nenhuma_promocao_encontrada");
		enviaMensagem(msg, msg);
	    }
	}
    }

    /**
     * voltarBusca
     */
    public void voltarBusca() {
	try {
	    FacesContext.getCurrentInstance().getExternalContext()
		    .redirect("/" + CONSTANTES.URLUSAPRE + "/gerenciamentoConsulteCompareProdutos.jsf");
	} catch (Exception ex) {
	    ex.printStackTrace();
	}
    }

    // SETS AND GETS
    public List<RamoAtividade> getRamoAtividades() {
	return ramoAtividades;
    }

    public void setRamoAtividades(List<RamoAtividade> ramoAtividades) {
	this.ramoAtividades = ramoAtividades;
    }

    public RamoAtividade getRamoAtividade() {
	return ramoAtividade;
    }

    public void setRamoAtividade(RamoAtividade ramoAtividade) {
	this.ramoAtividade = ramoAtividade;
    }

    public String getNomeProduto() {
	return nomeProduto;
    }

    public void setNomeProduto(String nomeProduto) {
	this.nomeProduto = nomeProduto;
    }

    public List<Produtos> getProdutos() {
	return produtos;
    }

    public void setProdutos(List<Produtos> produtos) {
	this.produtos = produtos;
    }

    public Produtos getProduto() {
	return produto;
    }

    public void setProduto(Produtos produto) {
	this.produto = produto;
    }

    public List<GradeProdutos> getGradeProdutos() {
	return gradeProdutos;
    }

    public void setGradeProdutos(List<GradeProdutos> gradeProdutos) {
	this.gradeProdutos = gradeProdutos;
    }

    public List<Uf> getUfs() {
	return ufs;
    }

    public void setUfs(List<Uf> ufs) {
	this.ufs = ufs;
    }

    public Uf getUf() {
	return uf;
    }

    public void setUf(Uf uf) {
	this.uf = uf;
    }

    public List<Cidade> getCidades() {
	return cidades;
    }

    public void setCidades(List<Cidade> cidades) {
	this.cidades = cidades;
    }

    public Cidade getCidade() {
	return cidade;
    }

    public void setCidade(Cidade cidade) {
	this.cidade = cidade;
    }

    public List<Bairro> getBairros() {
	return bairros;
    }

    public void setBairros(List<Bairro> bairros) {
	this.bairros = bairros;
    }

    public Bairro getBairro() {
	return bairro;
    }

    public void setBairro(Bairro bairro) {
	this.bairro = bairro;
    }

    public Integer getQuantidadeProdutos() {
	return quantidadeProdutos;
    }

    public void setQuantidadeProdutos(Integer quantidadeProdutos) {
	this.quantidadeProdutos = quantidadeProdutos;
    }

}
